/***********************************************************************************
 * 文件名： btn_ctrl_static.c
 * 版本： 4
 * 说明：
 * 		独立按钮控制器。扫描按钮，报告各种按钮事件。静态定义意味着只支持1个按钮，多个按钮请
 *  使用 btn_ctrl 组件。
 *      在合适的地方调用 Btn_Loop 确保其间隔10ms左右会被执行一次。当有按钮事件发生时，本组件
 *  会通过调用 Btn_Event 来进行通知，所以请在需要的地方实现 void Btn_Event(btn_ev_t e) 函
 *  数来接收按钮事件。
 *      在文件 btn_ctrl_config.h 中进行合适的配置。
 * 修改记录：
 * 	2021/04/21: 初版。 刘言。
 *  2021/05/12: 增加 Btn_IsDown()。刘言。
 *  2021/08/19: 支持完整版 POLSYS 。新增 Btn_Init 函数和 _Btn_HwInit 配置。
 *  2021/08/20: 新增消抖配置项。
***********************************************************************************/
#include "btn_ctrl_static.h"
#include "..\..\polsys.h"



static u8 Btn_mDxd = 0;
static u8 Btn_mUxd = 0xFF;		// 消抖计时变量
static u8 Btn_mClickCount = 0;  // 点击次数

#ifdef _BTN_USE_IS_DOWN_FUNC
bit _Btn_mIsDown = false;
#endif

#ifndef POLSYS_LITE
static pdata polsys_task_t mTask;
static void Btn_Loop();
#endif


// 声明引用事件通知函数（避免使用函数指针的妥协）
// 在你的应用代码中定义这个函数用于接收事件
void Btn_Event(btn_ev_t e);



void Btn_Init()
{
    _Btn_HwInit();
#ifndef POLSYS_LITE
    Polsys_TaskInit(&mTask, Btn_Loop, 10);
#endif
}


#ifndef POLSYS_LITE
static void Btn_Loop()
#else
//10ms执行一次
void Btn_Loop()
#endif
{
    if(_Btn_HwIsDown())
    {
        if(Btn_mDxd == _BTN_DOWN_DELAY)  //按下时间达到10ms
        {
#ifdef _BTN_USE_IS_DOWN_FUNC
            _Btn_mIsDown = true;
#endif
            Btn_Event(BTN_EV_DOWN);
            Btn_mUxd = 0;
        }
#ifdef BTN_USE_LONG_PRESS
        if(Btn_mDxd == _BTN_LONG_PRESS_TIME/10)     //按下的时间达到
        {
            Btn_Event(BTN_EV_LONG_PRESS);
        }
#endif
        if(Btn_mDxd<0xFF)Btn_mDxd++;
    }
    else
    {
        if(Btn_mUxd == _BTN_UP_DELAY)   //松手的时间达到20ms执行一次
        {
#ifdef _BTN_USE_IS_DOWN_FUNC
            _Btn_mIsDown = false;
#endif
            Btn_Event(BTN_EV_UP);     // 通知松手事件
            if(Btn_mDxd<36)    // 如果按下的时间在0ms~360ms之间，认为是短按
            {
                Btn_mClickCount++;
#ifdef BTN_USE_CLICK
                if(Btn_mClickCount == 1)Btn_Event(BTN_EV_CLICK);
#endif
                if(Btn_mClickCount == 5)
                    Btn_Event(BTN_EV_CLICK_5);    // 5击事件
            }
            //else
            //{
                /* 长按松手事件 */
            //}
            Btn_mDxd = 0;   // 清零按下计时
        }
        else if(Btn_mUxd == 36) // 松手的时间达到360ms
        {
            if(Btn_mClickCount<5&&Btn_mClickCount>1)    // 2~4
            {
                Btn_Event(Btn_mClickCount+(BTN_EV_CLICK - 1));
            }
            Btn_mClickCount = 0;
        }
        if(Btn_mUxd<0xFF)Btn_mUxd++;
    }
    //如果单独线程在此处加入Sleep(10);
}


// void Btn_Init()
// {

// }






